package com.agile.leetcode.order.delayqueue;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

/**
 * 该方案是利用JDK自带的DelayQueue来实现，这是一个无界阻塞队列，该队列只有在延迟期满的时候才能从中获取元素，放入DelayQueue中的对象，
 * 是必须实现Delayed接口的。
 * 其中Poll():获取并移除队列的超时元素，没有则返回空
 * <p>
 * take():获取并移除队列的超时元素，如果没有则wait当前线程，直到有元素满足超时条件，返回结果。
 * 优缺点
 * <p>
 * 优点:效率高,任务触发时间延迟低。
 * <p>
 * 缺点:
 * <p>
 * (1)服务器重启后，数据全部消失，怕宕机 (2)集群扩展相当麻烦 (3)因为内存条件限制的原因，比如下单未付款的订单数太多，
 * 那么很容易就出现OOM异常 (4)代码复杂度较高
 *
 * @Author:ChenZhangKun
 * @Date: 2021/9/15 10:20
 */
public class Client {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();

        list.add("00000001");

        list.add("00000002");

        list.add("00000003");

        list.add("00000004");

        list.add("00000005");

        DelayQueue<OrderDelay> queue = new DelayQueue<OrderDelay>();

        long start = System.currentTimeMillis();

        for (int i = 0; i < 5; i++) {

            //延迟三秒取出

            queue.put(new OrderDelay(list.get(i),

                    TimeUnit.NANOSECONDS.convert(ThreadLocalRandom.current().nextInt(5), TimeUnit.SECONDS)));



        }
        for (int i = 0; i < 5; i++) {
            try {

                queue.take().print();

                System.out.println("After " +

                        (System.currentTimeMillis() - start) + " MilliSeconds");

            } catch (InterruptedException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }
        }



    }
}
